// // Learn TypeScript:
// //  - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// // Learn Attribute:
// //  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// // Learn life-cycle callbacks:
// //  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html

// import { UITransform, easing, tween, v3 } from "cc";
// import { GComponent, GRoot, RelationType, Transition, UIPackage } from "fairygui-cc";
// import { Ctor } from "../puremvc/RegistFunc";
// const fuiPath = "fui/";
// export function RFui<T extends GComponent>(pkgName: string, comName: string) {
//     return function (viewCtor: Ctor<FuiCom<T>>) {
//         let view = new viewCtor();
//         view.pkg = { pkgName, comName };
//     }
// }
// export class FuiCom extends GComponent {
//     private get pkgPath() {
//         return `${fuiPath}${this.pkg.pkgName}`;
//     }
//     protected getResUrl(resName: string) {
//         return UIPackage.getItemURL(this.pkg.pkgName, resName);
//     }
//     static backShow(view: GComponent) {
//         view.scaleX = view.scaleY = 0;
//         view.pivotX = view.pivotY = 0.5;
//         tween(view).to(0.5, { scaleY: 1, scaleX: 1 }, { easing: easing.backOut }).start();

//     }
//     static clear() {
//         if (this.initGroot)
//             GRoot.inst.visible = false;
//         this.initGroot = false;
//     }
//     private static initGroot: boolean = false;
//     protected isShow: boolean = false;
//     public get IsShow() { return this.isShow; }
//     public show() {
//         this.isShow = true;
//         this.refreshShow();
//         // EventCenter.on(E_Tick, this.tickRefresh, this);
//     }
//     public hide() {
//         this.isShow = false;
//         this.refreshShow();
//         // EventCenter.off(E_Tick, this.tickRefresh, this);
//     }
//     private refreshShow() {
//         if (!this._isFuiLoaded)
//             return;
//         this.visible = this.isShow;
//     }
//     async load() {
//         return new Promise<void>((resolve, reject) => {
//             if (!FuiCom.initGroot) {
//                 FuiCom.initGroot = true;
//                 GRoot.create();
//                 GRoot.inst.visible = true;
//                 GRoot.inst.node.getComponent(UITransform).anchorX = GRoot.inst.node.getComponent(UITransform).anchorY = 0.5;
//                 GRoot.inst.node.position = v3();
//             }
//             // let fuiBinder = binder.get(this.pkg.pkgName);
//             // if (!fuiBinder) {
//             //     console.error("没有设置binder：", this.pkg.pkgName);
//             //     return;
//             // }
//             // fuiBinder.bindAll();
//             this.isShow = this.active;
//             this._isFuiLoaded = false;
//             UIPackage.loadPackage(this.pkgPath, (err, pkg) => {
//                 if (err) {
//                     console.error("加载fui失败：", this.pkg.pkgName, this.pkg.comName);
//                     reject();
//                     return;
//                 }
//                 this.onUILoaded();
//                 resolve();
//             });

//         })

//     }
//     clear(): void {
//         this.hide();
//         this._view.dispose();
//     }

//     onUILoaded() {
//         // UIPackage.addPackage(this.pkgPath);
//         this._isFuiLoaded = true;

//         this._view = UIPackage.createObject(this.pkg.pkgName, this.pkg.comName) as T;

//         this._view.width = GRoot.inst.width;
//         this._view.height = GRoot.inst.height;
//         this._view.addRelation(GRoot.inst, RelationType.Width);
//         this._view.addRelation(GRoot.inst, RelationType.Height);
//         GRoot.inst.addChild(this._view);
//         console.log("load:", this.pkg.comName);
//         this.onFuiInit();
//         if (this.isShow)
//             this.show();
//         else
//             this.hide();
//     }
//     tickRefresh() {

//     }
//     protected onFuiInit() {

//     }
//     protected update(dt: number): void {
//         if (this._isFuiLoaded)
//             this.onUpdate(dt);
//     }
//     protected onUpdate(dt: number) {

//     }
//     onDestroy() {
//         this._view.dispose();
//     }
//     static async awaitTrans(trans: Transition) {
//         return new Promise<void>(resolve => {
//             trans.play(() => {
//                 resolve();
//             })
//         });
//     }
// }
